#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=2e5+10;
int dp[maxn]; // 第i 天使用 第 j 个计划的最大值
int k[maxn], s[maxn];
int n, m, q;
set<int> days;

// 中断的话, 一定由前面转移过来
// 初始化, 怎么初始化: 不用初始化, 直接就是 0
// 转移的话: 这个就是多重背包, 可以使用多次的, 那么内层循环就是 正着来的

void solve(){
	cin>>n>>m>>q;
	for(int i=1;i<=q;i++){
		int tmp;
		cin>>tmp;
		days.insert(tmp);
	}
	for(int i=1;i<=m;i++){
		int a, b;
		cin>>a>>b;
		k[i]=(1<<a);
		s[i]=b;
	}
	
	for(int i=1;i<=n;i++){ // 背包的容量
		for(int j=1;j<=m;j++){ // 对于 j 个训练计划
			if(days.count(i)){ // 不能练
				dp[i]=max(dp[i], dp[i-1]);
				continue;
			}
			if(i>=k[j]){ //能够装下
				// 但是需要看他是不是会跨过一个 休息天
				if (days.upper_bound(i-k[j])!=days.end()) {
					if(*(days.upper_bound(i-k[j]))<=i){ // 跨过 了休息天
						dp[i]=max(dp[i], dp[i-1]);
					} else {
						dp[i]=max(dp[i], dp[i-k[j]]+s[j]);											
					}
				} else {
					dp[i]=max(dp[i], dp[i-k[j]]+s[j]);					
				}
			}
//			cout<<i<<' '<<j<<' '<<k[j]<<' '<<dp[i]<<'\n';
		}
	}
	
	cout<<dp[n]<<'\n';
}


signed main(){
	ios::sync_with_stdio(0), cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
